using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DProximity
{
    /// <summary>
    /// <para>Buffer 3D</para>
    /// <para>Creates a 3-dimensional buffer around points or lines to produce spherical or cylindrical multipatch features.</para>
    /// <para>在点或线周围创建三维缓冲区，以生成球面或圆柱面多面体要素。</para>
    /// </summary>    
    [DisplayName("Buffer 3D")]
    public class Buffer3D : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Buffer3D()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The line or point features to be buffered.</para>
        /// <para>要缓冲的线或点要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output multipatch containing the 3D buffers.</para>
        /// <para>包含 3D 缓冲区的输出多面体。</para>
        /// </param>
        /// <param name="_buffer_distance_or_field">
        /// <para>Distance</para>
        /// <para><xdoc>
        ///   <para>The distance of the buffer around the input features, which can be provided as either a linear distance or be derived from a numeric field in the input feature's attribute table. If the buffer distance is specified from an input field, its unit of measurement will be derived from the feature's spatial reference. If the linear distance is specified as a numeric value, the following units of measure are supported:</para>
        ///   <bulletList>
        ///     <bullet_item>Unknown—Unknown</bullet_item><para/>
        ///     <bullet_item>Inches—Inches</bullet_item><para/>
        ///     <bullet_item>Feet—Feet</bullet_item><para/>
        ///     <bullet_item>Yards—Yards</bullet_item><para/>
        ///     <bullet_item>Miles—Miles</bullet_item><para/>
        ///     <bullet_item>Millimeters—Millimeters</bullet_item><para/>
        ///     <bullet_item>Centimeters—Centimeters</bullet_item><para/>
        ///     <bullet_item>Decimeters—Decimeters</bullet_item><para/>
        ///     <bullet_item>Meters—Meters</bullet_item><para/>
        ///     <bullet_item>Kilometers—Kilometers</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入要素周围缓冲区的距离，可以作为线性距离提供，也可以从输入要素属性表中的数值字段派生。如果从输入字段指定缓冲距离，则其测量单位将派生自要素的空间参考。如果将线性距离指定为数值，则支持以下测量单位：</para>
        ///   <bulletList>
        ///     <bullet_item>未知 - 未知</bullet_item><para/>
        ///     <bullet_item>英寸—英寸</bullet_item><para/>
        ///     <bullet_item>英尺 - 英尺</bullet_item><para/>
        ///     <bullet_item>码 - 码</bullet_item><para/>
        ///     <bullet_item>英里 - 英里</bullet_item><para/>
        ///     <bullet_item>毫米 - 毫米</bullet_item><para/>
        ///     <bullet_item>厘米—厘米</bullet_item><para/>
        ///     <bullet_item>分米 - 分米</bullet_item><para/>
        ///     <bullet_item>米 - 米</bullet_item><para/>
        ///     <bullet_item>公里 - 公里</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public Buffer3D(object _in_features, object _out_feature_class, object _buffer_distance_or_field)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._buffer_distance_or_field = _buffer_distance_or_field;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Buffer 3D";

        public override string CallName => "3d.Buffer3D";

        public override List<string> AcceptEnvironments => ["XYDomain", "ZDomain", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _buffer_distance_or_field, _buffer_joint_type.GetGPValue(), _buffer_quality, _simplification_tolerance];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The line or point features to be buffered.</para>
        /// <para>要缓冲的线或点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output multipatch containing the 3D buffers.</para>
        /// <para>包含 3D 缓冲区的输出多面体。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Distance</para>
        /// <para><xdoc>
        ///   <para>The distance of the buffer around the input features, which can be provided as either a linear distance or be derived from a numeric field in the input feature's attribute table. If the buffer distance is specified from an input field, its unit of measurement will be derived from the feature's spatial reference. If the linear distance is specified as a numeric value, the following units of measure are supported:</para>
        ///   <bulletList>
        ///     <bullet_item>Unknown—Unknown</bullet_item><para/>
        ///     <bullet_item>Inches—Inches</bullet_item><para/>
        ///     <bullet_item>Feet—Feet</bullet_item><para/>
        ///     <bullet_item>Yards—Yards</bullet_item><para/>
        ///     <bullet_item>Miles—Miles</bullet_item><para/>
        ///     <bullet_item>Millimeters—Millimeters</bullet_item><para/>
        ///     <bullet_item>Centimeters—Centimeters</bullet_item><para/>
        ///     <bullet_item>Decimeters—Decimeters</bullet_item><para/>
        ///     <bullet_item>Meters—Meters</bullet_item><para/>
        ///     <bullet_item>Kilometers—Kilometers</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入要素周围缓冲区的距离，可以作为线性距离提供，也可以从输入要素属性表中的数值字段派生。如果从输入字段指定缓冲距离，则其测量单位将派生自要素的空间参考。如果将线性距离指定为数值，则支持以下测量单位：</para>
        ///   <bulletList>
        ///     <bullet_item>未知 - 未知</bullet_item><para/>
        ///     <bullet_item>英寸—英寸</bullet_item><para/>
        ///     <bullet_item>英尺 - 英尺</bullet_item><para/>
        ///     <bullet_item>码 - 码</bullet_item><para/>
        ///     <bullet_item>英里 - 英里</bullet_item><para/>
        ///     <bullet_item>毫米 - 毫米</bullet_item><para/>
        ///     <bullet_item>厘米—厘米</bullet_item><para/>
        ///     <bullet_item>分米 - 分米</bullet_item><para/>
        ///     <bullet_item>米 - 米</bullet_item><para/>
        ///     <bullet_item>公里 - 公里</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _buffer_distance_or_field { get; set; }


        /// <summary>
        /// <para>Joint Type</para>
        /// <para><xdoc>
        ///   <para>The shape of the buffer between the vertices of the line segments. This parameter is only valid for input line features.</para>
        ///   <bulletList>
        ///     <bullet_item>Straight—The shape of connections between vertices will be straight. This is the default.</bullet_item><para/>
        ///     <bullet_item>Round—The shape of connections between vertices will be round.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>线段顶点之间的缓冲区形状。此参数仅对输入线要素有效。</para>
        ///   <bulletList>
        ///     <bullet_item>直线—顶点之间的连接形状将是直线。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>倒圆角—折点之间的连接形状将为倒圆角。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Joint Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _buffer_joint_type_value _buffer_joint_type { get; set; } = _buffer_joint_type_value._STRAIGHT;

        public enum _buffer_joint_type_value
        {
            /// <summary>
            /// <para>Straight</para>
            /// <para>Straight—The shape of connections between vertices will be straight. This is the default.</para>
            /// <para>直线—顶点之间的连接形状将是直线。这是默认设置。</para>
            /// </summary>
            [Description("Straight")]
            [GPEnumValue("STRAIGHT")]
            _STRAIGHT,

            /// <summary>
            /// <para>Round</para>
            /// <para>Round—The shape of connections between vertices will be round.</para>
            /// <para>倒圆角—折点之间的连接形状将为倒圆角。</para>
            /// </summary>
            [Description("Round")]
            [GPEnumValue("ROUND")]
            _ROUND,

        }

        /// <summary>
        /// <para>Buffer Quality</para>
        /// <para>The number of segments used to represent the resulting multipatch features. The default is 20, but any number between the range of 6 to 60 can be entered. A higher Buffer Quality value produces smoother 3D features, but also lengthens the processing time.</para>
        /// <para>用于表示生成的多面体要素的线段数。默认值为 20，但可以输入 6 到 60 之间的任何数字。“缓冲区质量”值越高，可生成更平滑的 3D 特征，但也会延长处理时间。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Buffer Quality")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _buffer_quality { get; set; } = 20;


        /// <summary>
        /// <para>Simplification (Maximum Allowable Offset)</para>
        /// <para><xdoc>
        ///   <para>Simplifies the input lines by maintaining their shape within the specified offset of its original form. Simplification will not take place if no value is specified. The following units of measurement are supported:</para>
        ///   <bulletList>
        ///     <bullet_item>Unknown—Unknown</bullet_item><para/>
        ///     <bullet_item>Inches—Inches</bullet_item><para/>
        ///     <bullet_item>Feet—Feet</bullet_item><para/>
        ///     <bullet_item>Yards—Yards</bullet_item><para/>
        ///     <bullet_item>Miles—Miles</bullet_item><para/>
        ///     <bullet_item>Millimeters—Millimeters</bullet_item><para/>
        ///     <bullet_item>Centimeters—Centimeters</bullet_item><para/>
        ///     <bullet_item>Decimeters—Decimeters</bullet_item><para/>
        ///     <bullet_item>Meters—Meters</bullet_item><para/>
        ///     <bullet_item>Kilometers—Kilometers</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>通过将输入线的形状保持在其原始形式的指定偏移量内来简化输入线。如果未指定任何值，则不会进行简化。支持以下计量单位：</para>
        ///   <bulletList>
        ///     <bullet_item>未知 - 未知</bullet_item><para/>
        ///     <bullet_item>英寸—英寸</bullet_item><para/>
        ///     <bullet_item>英尺 - 英尺</bullet_item><para/>
        ///     <bullet_item>码 - 码</bullet_item><para/>
        ///     <bullet_item>英里 - 英里</bullet_item><para/>
        ///     <bullet_item>毫米 - 毫米</bullet_item><para/>
        ///     <bullet_item>厘米—厘米</bullet_item><para/>
        ///     <bullet_item>分米 - 分米</bullet_item><para/>
        ///     <bullet_item>米 - 米</bullet_item><para/>
        ///     <bullet_item>公里 - 公里</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Simplification (Maximum Allowable Offset)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _simplification_tolerance { get; set; } = null;


        public Buffer3D SetEnv(object XYDomain = null, object ZDomain = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, ZDomain: ZDomain, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}